package com.itheima.edu.info.manager.dao;

import com.itheima.edu.info.manager.domain.Student;

import java.util.ArrayList;

/*
升级:将系统容器由数组升级为集合
 */
public class OtherStudentDao implements BaseStudentDao {
    //1.定义一个系统数据仓库,集合实现
    private static ArrayList<Student> stus = new ArrayList<>();

    //静态代码块:随着类的加载而加载,自动执行!
    //作用,一般用来数据的初始化,系统配置的加载
    static {
        System.out.println("--------系统数据加载中Loading--------");
        Student stu1 = new Student("heima001", "柳岩", "28", "1998-11-11");
        Student stu2 = new Student("heima002", "柳岩", "28", "1998-11-11");
        //将学生对象存入集合容器
        stus.add(stu1);
        stus.add(stu2);
    }

    //库管类中的添加学生功能
    public boolean addStudnet(Student stu) {
        stus.add(stu);
        return true;
    }

    //库管类中的查看学生功能
    public Student[] findAllStudent() {
        //将集合转成数组返回
        //定义一个数组
        Student[] stuArray = new Student[stus.size()];
        //遍历集合,将每一个元素复制到数组中
        for (int i = 0; i < stus.size(); i++) {
            Student stu = stus.get(i);
            stuArray[i] = stu;
        }
        return stuArray;
    }

    //库管类中的删除学生功能
    public boolean deleteStudent(String deleteId) {
        //1.找到本次要删除的学号对应的学生对象在数组中对应的索引位置
        int index = getIndex(deleteId);
        //2.根据index 的值来决定是否删除成功
        if (index == -1) {
            //说明传过来的学号不存在,直接返回false表示删除失败
            return false;
        } else {
            //不是-1,说明传过来的学号在系统中存在,将该索引位置置为null,表示删除
            stus.remove(index);
            return true;
        }
    }

    //库管类修改学生功能
    public boolean updateStudent(String updateId, Student newStu) {
        //1.根据要修改的学号找到对应的学生在数组中的索引位置
        int index = getIndex(updateId);
        //2. 拿新的学生对象去替换该索引位置原本的老对象.从而达到修改目的.
        stus.set(index, newStu);
        return true;
    }

    //封装一个根据学号查找学生对象在数组中的索引位置的方法
    public int getIndex(String id) {
        //先假设要删除的学号不存在
        int index = -1;
        //遍历数组
        for (int i = 0; i < stus.size(); i++) {
            Student stu = stus.get(i);
            //当前索引位置的元素不为null并且该元素的学号和要删除的学号一致,修改标记
            if (stu != null && stu.getId().equals(id)) {
                //修改标记,记录当前学生对象的索引值
                index = i;
                break;
            }
        }
        //返回index即可
        return index;
    }
}
